Andrew Kirmse makes changes allowing use of 'wchar_t' version expat lib.
authorrobertl <robertl@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Fri, 5 May 2006 14:42:05 +0000 (14:42 +0000)
committerrobertl <robertl@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Fri, 5 May 2006 14:42:05 +0000 (14:42 +0000)
gpsbabel/cet_util.c
gpsbabel/cet_util.h
gpsbabel/coastexp.c
gpsbabel/defs.h
gpsbabel/gpx.c
gpsbabel/hsa_ndv.c
gpsbabel/mkshort.c
gpsbabel/navicache.c
gpsbabel/xmlgeneric.c

index 08d021e545d684a3a85c21b1b41cd721ff2ecbc1..d5ee5c8f3bdb122a436d61716bbf2def3c559f20 100644 (file)
@@ -114,11 +114,13 @@ cet_str_cp1252_to_utf8(const char *src)
  *
  */
 #if HAVE_LIBEXPAT
-int XMLCALL cet_lib_expat_UnknownEncodingHandler(void *data, const XML_Char *encoding, XML_Encoding *info)
+int XMLCALL cet_lib_expat_UnknownEncodingHandler(void *data, const XML_Char *xml_encoding, XML_Encoding *info)
 {
        cet_cs_vec_t *cs;
        int i, c, ucs4_def;
+       const char *encoding;
 
+       encoding = xml_convert_to_char_string(xml_encoding);
        cs = cet_find_cs_by_name(encoding);
        if (cs == NULL) return XML_STATUS_ERROR;        /* fatal(MYNAME ": Unknown character set \"%s\"!\n", encoding); */
        
@@ -142,6 +144,7 @@ int XMLCALL cet_lib_expat_UnknownEncodingHandler(void *data, const XML_Char *enc
        if (global_opts.verbose_status > 0)
            printf(MYNAME ": XML parser - encoding handler for character set \"%s\" established.\n", encoding);
            
+       xml_free_converted_string(encoding);
        return XML_STATUS_OK;
 }
 #endif
@@ -1148,3 +1151,59 @@ int cet_fprintf(FILE *stream, const cet_cs_vec_t *src_vec, const char *fmt, ...)
        
        return res;
 }
+
+
+const char *xml_convert_to_char_string(const XML_Char *str)
+{
+#ifdef XML_UNICODE  
+       return cet_str_uni_to_utf8(str, wcslen(str));
+#else
+       return str;
+#endif  
+}
+
+void xml_free_converted_string(const char *str)
+{
+#ifdef XML_UNICODE  
+       xfree(str);
+#endif  
+}
+
+const char **xml_convert_attrs_to_char_string(const XML_Char **xml_attr)
+{
+#ifdef XML_UNICODE
+  // First count size of array
+  int size = 0;
+  int i;
+  const XML_Char **ptr;
+  const char **char_attrs;
+
+  if (xml_attr == NULL)
+    return NULL;
+
+  for (ptr = xml_attr; *ptr != NULL; ++ptr)
+    ++size;
+
+  // Allocate space
+  char_attrs = xmalloc((size + 1) * sizeof(char *));
+
+  // Duplicate strings
+  for (i = 0; i < size; ++i)
+    char_attrs[i] = xml_convert_to_char_string(xml_attr[i]);
+  char_attrs[size] = NULL;
+
+  return char_attrs;
+#else
+  return xml_attr;
+#endif
+}
+
+void xml_free_converted_attrs(const char **attr)
+{
+#ifdef XML_UNICODE  
+       while (attr != NULL && *attr != NULL) {
+               xfree(*attr);
+               ++attr;
+       }
+#endif
+}
index 84754ca455520f5e8513317fb35ed210006293cd..a5ac1624735b90e277d741f53e0b6fc617901a5a 100644 (file)
@@ -113,4 +113,18 @@ void cet_convert_deinit(void);
 
 void cet_disp_character_set_names(FILE *fout);
 
+/*
+ * Conversion from XML_Char string to char string.  If XML_Char is the
+ * same as char, these routines do nothing.  If XML_Char is a wide
+ * character, xml_convert_to_char_string converts the string to a
+ * newly allocated char string, and xml_free_converted_string frees
+ * it.
+ */
+
+const char *xml_convert_to_char_string(const XML_Char *str);
+void xml_free_converted_string(const char *str);
+
+const char **xml_convert_attrs_to_char_string(const XML_Char **xml_attr);
+void xml_free_converted_attrs(const char **attr);
+
 #endif
index 55359c6f20c354919f4e54c084688302fa63ba09..834663981e95268166b98e7abb88656aed6acc8e 100755 (executable)
@@ -131,9 +131,13 @@ ce_read(void)
 
 /* Start processing an XML item */
 static void
-ce_start(void *data, const char *el, const char **attr)
+ce_start(void *data, const XML_Char *xml_el, const XML_Char **xml_attr)
 {
+       const char *el = xml_convert_to_char_string(xml_el);
        const char **ap;
+       const char **attr;
+
+       attr = xml_convert_attrs_to_char_string(xml_attr);
        strcpy(element, el);
        if (0 == strcmp(el, "Route")) {
                inRoute = 1;
@@ -165,12 +169,15 @@ ce_start(void *data, const char *el, const char **attr)
                        }
                }
        }
+       xml_free_converted_string(el);
+       xml_free_converted_attrs(attr);
 }
 
 /* Finish processing an XML item */
 static void
-ce_end(void *data, const char *el)
+ce_end(void *data, const XML_Char *xml_el)
 {
+       const char *el = xml_convert_to_char_string(xml_el);
        if (0 == strcmp(el, "Route")) {
                if (!doing_rtes)
                        ce_free_route(currentRoute);
@@ -178,12 +185,14 @@ ce_end(void *data, const char *el)
        }
        else if (0 == strcmp(el, "Mark"))
                inMark = 0;
+       xml_free_converted_string(el);
 }
 
 /* Process some XML character data for the current item */
 static void
-ce_cdata(void *dta, const XML_Char *s, int len)
+ce_cdata(void *dta, const XML_Char *xml_s, int len)
 {
+       const char *s = xml_convert_to_char_string(xml_s);
        if (*s != '\n') {
                char *edatastr;
                // We buffer up characters in 'cdatastr' until a single <lf> is received
@@ -294,6 +303,8 @@ ce_cdata(void *dta, const XML_Char *s, int len)
                // Start building a new string since we are done with this one
                cdatastr[0] = '\0';
        }
+
+       xml_free_converted_string(s);
 }
 
 /* Set up reading the CE input file */
index 9e0d0aed4c036478c8e7df945e2b976ef8adbcc8..2412d3a8e1e8ef930108d8124ce14f4fe83cba48 100644 (file)
 #include "cet_util.h"
 #include "inifile.h"
 
+// Turn on Unicode in expat?
+#ifdef _UNICODE
+#  define XML_UNICODE
+#endif
 
 /*
  * Amazingly, this constant is not specified in the standard...
index 75828a9a60a1f16efd6e563094b30e829abd91d1..348e05f5743fb914439f4a4afd85e045648cee99 100644 (file)
@@ -455,13 +455,13 @@ start_something_else(const char *el, const char **attrv)
        int attr_count = 0;
        xml_tag *new_tag;
        fs_xml *fs_gpx;
-       
+
        if ( !fs_ptr ) {
                return;
        }
        
-        new_tag = (xml_tag *)xcalloc(sizeof(xml_tag),1);
-        new_tag->tagname = xstrdup(el);
+       new_tag = (xml_tag *)xcalloc(sizeof(xml_tag),1);
+       new_tag->tagname = xstrdup(el);
        
        /* count attributes */
        while (*avp) {
@@ -562,11 +562,13 @@ tag_log_wpt(const char **attrv)
 }
 
 static void
-gpx_start(void *data, const char *el, const char **attr)
+gpx_start(void *data, const XML_Char *xml_el, const XML_Char **xml_attr)
 {
        char *e;
        char *ep;
        int passthrough;
+       const char *el = xml_convert_to_char_string(xml_el);
+       const char **attr = xml_convert_attrs_to_char_string(xml_attr);
 
        vmem_realloc(&current_tag, strlen(current_tag.mem) + 2 + strlen(el));
        e = current_tag.mem;
@@ -629,6 +631,8 @@ gpx_start(void *data, const char *el, const char **attr)
        if (passthrough) {
                start_something_else(el, attr);
        }
+       xml_free_converted_string(el);
+       xml_free_converted_attrs(attr);
 }
 
 struct
@@ -775,14 +779,15 @@ xml_parse_time( const char *cdatastr )
        
        rv = mkgmtime(&tm) - off_sign*off_hr*3600 - off_sign*off_min*60;
        
-        xfree(timestr);
+       xfree(timestr);
        
        return rv;
 }
 
 static void
-gpx_end(void *data, const char *el)
+gpx_end(void *data, const XML_Char *xml_el)
 {
+       const char *el = xml_convert_to_char_string(xml_el);
        char *s = strrchr(current_tag.mem, '/');
        float x;
        char *cdatastrp = cdatastr.mem;
@@ -1024,6 +1029,7 @@ gpx_end(void *data, const char *el)
        }
 
        *s = 0;
+       xml_free_converted_string(el);
 }
 
 #if ! HAVE_LIBEXPAT
@@ -1341,7 +1347,7 @@ void free_gpx_extras( xml_tag *tag )
                        xfree(tag->parentcdata);
                }
                if (tag->tagname) {
-                       xfree(tag->tagname);
+                       xfree(tag->tagname);
                }
                if (tag->attributes) {
                        ap = tag->attributes;
@@ -1657,7 +1663,7 @@ gpx_write(void)
                fatal(MYNAME ": gpx version number of '%s' not valid.\n", gpx_wversion);
        }
        
-        now = current_time();
+       now = current_time();
 
        short_length = atoi(snlen);
 
index 7b680b3e60b49d8b764879e927d2a20e57548274..18abb53ee4c817001c3bf813c6df563cdae275db 100644 (file)
@@ -68,8 +68,10 @@ hsa_ndv_read(void)
 #else
 
 static void
-hsa_ndv_start(void *data, const char *el, const char **attr)
+hsa_ndv_start(void *data, const XML_Char *xml_el, const XML_Char **attr)
 {
+       const char *el = xml_convert_to_char_string(xml_el);
+  
 //     printf("<%s>\n", el);
        if (strcmp(el, "Export") == 0)
        {//should only be one
@@ -90,11 +92,13 @@ hsa_ndv_start(void *data, const char *el, const char **attr)
        }
        //reset data :)
        memset(cdatastr,0, MY_CBUF);
+       xml_free_converted_string(el);
 }
 
 static void
-hsa_ndv_end(void *data, const char *el)
+hsa_ndv_end(void *data, const XML_Char *xml_el)
 {
+       const char *el = xml_convert_to_char_string(xml_el);
        if (in_Route)
        {
                if (strcmp(el, "Version") == 0)
@@ -191,6 +195,7 @@ hsa_ndv_end(void *data, const char *el)
        {
                in_ChartWork--;
        }
+       xml_free_converted_string(el);
 }
 
 static void
index 5949c0d751b7a1f9898ecd6e92ed699a5c11acff..daa7514349cd45dc46ca44d4de5e273edc92ad37 100644 (file)
@@ -28,7 +28,7 @@
 static const char vowels[] = "aeiouAEIOU";
 
 #define DEFAULT_TARGET_LEN 8
-#define DEFAULT_BADCHARS "\"$.,'!-"
+static const char *DEFAULT_BADCHARS = "\"$.,'!-";
 
 /*
  * Hash table tunings.   The reality is that our hash doesn't have to be 
index 8a2fe8a81c32ebf1a05a722784fe25632c3007da..de50e7f8a023fcdd61a89fa1c7078b15e6da2341 100644 (file)
@@ -108,8 +108,13 @@ nc_mkcont(const char *t)
 }
 
 static void
-nav_start(void *data, const char *el, const char **attr)
+nav_start(void *data, const XML_Char *xml_el, const XML_Char **xml_attr)
 {
+       const char *el;
+       const char **attr;
+
+       el = xml_convert_to_char_string(xml_el);
+       attr = xml_convert_attrs_to_char_string(xml_attr);
        if (0 == strcmp(el, "CacheDetails")) {
                const char **ap;
                wpt_tmp = waypt_new();
@@ -192,10 +197,13 @@ nav_start(void *data, const char *el, const char **attr)
                }
                waypt_add(wpt_tmp);
        }
+
+       xml_free_converted_attrs(attr);
+       xml_free_converted_string(el);
 }
 
 static void
-nav_end(void *data, const char *el)
+nav_end(void *data, const XML_Char *el)
 {
 }
 
index a07e06d6a9573f12e1f0a1bde0e5d3d8637c7b76..e12b088fc06fea2b41a46c2aa4dd1976d5ca81db 100644 (file)
@@ -183,11 +183,16 @@ xml_consider_ignoring(const char *t)
 
 
 static void
-xml_start(void *data, const char *el, const char **attr)
+xml_start(void *data, const XML_Char *xml_el, const XML_Char **xml_attr)
 {
        char *e;
        char *ep;
        xg_callback *cb;
+       const char *el;
+       const char **attrs;
+
+       el = xml_convert_to_char_string(xml_el);
+       attrs = xml_convert_attrs_to_char_string(xml_attr);
 
        if (xml_consider_ignoring(el))
                return;
@@ -203,26 +208,31 @@ xml_start(void *data, const char *el, const char **attr)
 
        cb = xml_tbl_lookup(e, cb_start);
        if (cb) {
-               (*cb)(NULL, attr);
+               (*cb)(NULL, attrs);
        }
+       xml_free_converted_string(el);
+       xml_free_converted_attrs(attrs);
 }
 
 #if HAVE_LIBEXPAT
 static void
-xml_cdata(void *dta, const XML_Char *s, int len)
+xml_cdata(void *dta, const XML_Char *xml_s, int len)
 {
        char *estr;
+       const char *s = xml_convert_to_char_string(xml_s);
 
        vmem_realloc(&cdatastr,  1 + len + strlen(cdatastr.mem));
        estr = (char *) cdatastr.mem + strlen(cdatastr.mem);
        memcpy(estr, s, len);
        estr[len]  = 0;
+       xml_free_converted_string(s);
 }
 
 static void
-xml_end(void *data, const char *el)
+xml_end(void *data, const XML_Char *xml_el)
 {
        char *s = strrchr(current_tag.mem, '/');
+       const char *el = xml_convert_to_char_string(xml_el);
        xg_callback *cb;
 
        if (xml_consider_ignoring(el))
@@ -241,6 +251,7 @@ xml_end(void *data, const char *el)
                (*cb)(el, NULL);
        }
        *s = 0;
+       xml_free_converted_string(el);
 }
 
 void xml_read(void)